package sudoku.server.dominio;

import java.rmi.RemoteException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import sudoku.client.comunicaciones.IJugador;
import sudoku.server.comunicaciones.Notificador;
import sudoku.server.comunicaciones.StubJugador;
import sudoku.server.persistencia.FachadaPersistencia;
import sudoku.server.persistencia.TableroDAO;
import sudoku.server.presen.JFServer;

public class Kenken extends Tablero{
	private Vector <Area> areas;
	private Casilla [][] casillas;
	
	public Kenken() {
		areas=new Vector <Area>();
		casillas = new Casilla[6][6];
		for (int i=0; i<6; i++){
			for (int j = 0; j<6; i++){
				casillas[i][j]=new Casilla();
			}
		}	
		this.dao=FachadaPersistencia.getKenkenDAO(this);
	}
		
	public Kenken(String id) throws Exception {
		this();
		this.dao.getTablero(id);
	}
	
	public void setNumeros(String ristra) { //MIRAR ENTERO
		byte fila=0, columna=-1;
		for (byte i=0; i<ristra.length(); i++) {
			String c=""+ristra.charAt(i);
			byte idCasilla=(byte) (i/36);
			if (idCasilla>0 && i%36==0) {
				fila=0;
				columna=0;
			} else {
				columna++;
				if (columna==6) {
					fila++;
					columna=0;
				}
			}
			if (c.equals(" "))
				casillas[fila][columna].setNumero((byte) 0);
			else {
				final byte b=Byte.parseByte(c);
				casillas[fila][columna].setNumero(b);
			}
		}
	}

	public String toString() {
		String result="";
		for (int i=0; i<9; i++) {
			result+=casillas[i].toString();
		}
		return result;
	}


	public void poner(byte idCuadricula, byte fila, byte columna, byte numero) throws RemoteException, IllegalArgumentException {
		if (numero>=0 && numero<=6) {
			if (!this.esLegal(fila, columna, numero)) throw new IllegalArgumentException();
			this.casillas[fila][columna].setNumero(numero);
			update();
			notificar();
		}
	}
	
	public void quitar(byte idCuadricula, byte fila, byte columna) throws RemoteException {
		this.casillas[fila][columna].setNumero((byte) 0);
		update();
		notificar();
	}
	
	public void insert() throws Exception {
		this.dao.insert(this.toString());
	}

	protected void update() throws RemoteException {
		try {
			this.dao.update();
		} catch (Exception e) {
			throw new RemoteException(e.toString());
		}
	}

	private boolean esLegal (byte fila, byte columna, byte numero){
		boolean res = true;
		for (int i = 0; i < 6; i++){
			if (this.casillas[fila][i].getNumero() == numero) return false;
		}
		for (int i = 0; i <6; i++){
			if (this.casillas[i][columna].getNumero() == numero) return false;
		}
		return res;
	}
	
}